#ifndef QPROPERTYFORMVIEW_H
#define QPROPERTYFORMVIEW_H


#include <QPointer>
#include "QPropertyFormWidget.h"


namespace QPE {

class QProperty;
class QPropertyModel;
class QPropertySet;

//! This class populates a form layout with the properties in a model
class QTPROPERTYEXPLORER_DLL_EXPORT QPropertyFormView : public QPropertyFormWidget
{
	Q_OBJECT
public:
	//! Constructor
	explicit QPropertyFormView(QWidget *parent = 0);

	//! Constructor
	explicit QPropertyFormView(QPropertyModel* model, QWidget *parent = 0);

	//! Constructor
	explicit QPropertyFormView(QPropertySet* property_set, QWidget *parent = 0);
	
	//! Destructor
	virtual ~QPropertyFormView();

	
public slots:
	//! Rebuilds the whole form
	virtual void build();

	//! Set the source model. Leads to the rebuild of the form
	//! \param model The model to use
	void setModel(QPropertyModel* model);

	//! Set the property set to use. Note that if using a property set directly, adding and removing properties to the property set leads to undifined behaviour for the property set misses notification signals.
	//! \param model The property set to use
	void setPropertySet(QPropertySet* property_set);

	//! Called when a row gets removed in the model
	void rowsRemoved(const QModelIndex& parent, int start, int end);

	//! Called when a new row is being inserted into the model
	void rowsInserted(const QModelIndex& parent, int start, int end);

	//! Called when the model is being reset
	void modelReset();


private slots:
	//! Called, when the model gets destroyed
	void modelDestroyed();

	//! Called when data in the model gets changed
	void dataChanged(const QModelIndex& top_left, const QModelIndex& bottom_right);

	//! Updates the model when data was submitted by the view
	void dataSubmitted(QProperty* property);

protected:
	void showEvent(QShowEvent* event);

	//! Rebuilds the widegt only if it is visible
	void updatePropertyList();

	//! Removes the model and property set if they were set
	void removeModelAndSet();

	//! Function to handle newly created QPropertyWidgets
	virtual void connectPropertyFormWidget(QPropertyFormWidget* widget);


};

}	// Namespace QPE

#endif // QPROPERTYFORMVIEW_H
